/**
 * vue-i18n 使用姿势说明
 * see more : https://pikax.me/vue-composable/composable/i18n/i18n.html#parameters
 */

import { findKeyByValue } from '@/utils/common';
import { useI18n } from 'vue-composable';
import zhCN from '@/i18n/messages/zhCN';
import en from '@/i18n/messages/en';

/** 定义语言模版 */
export const Locales: any = {};

/**
 * @todo 语言名字命名要考虑三个部分：一是 antdv 组件国际化的语言名字，
 * 二是 i18n模版语言的命名，
 * 三是浏览器对于语言的命名（这里会跟 http 请* 求相关，也是后端能识别的语言命名），因此要将前两种语言的名字通过字典转换成标准名称，也就是浏览器的语言名使用SO 639-1标准
 */

export const TranslateTable: { [key: string]: string } = {
  en: 'en_US',
  zhCN: 'zh_CN',
};

export const LanguageNameList: { [key: string]: string } = {
  en: en.languageName,
  zhCN: zhCN.languageName,
};

export function useI18nApp() {
  const i18nInstance = useI18n({
    locale: 'zhCN',
    messages: {
      zhCN,
      en,
    },
  });
  return {
    i18nInstance,
  };
}

/**
 * @description 自动加载 antd-vue 需要的语言模版
 */
function loadAtdLocales() {
  const files = require.context(
    '../../node_modules/ant-design-vue/es/locale-provider',
    true,
    /\.js$/,
  );

  const TranslateTableValues = Object.values(TranslateTable);

  files.keys().forEach(key => {
    const fileName = key.slice(2, key.lastIndexOf('.'));
    if (TranslateTableValues.indexOf(fileName) > -1) {
      const localeKey = findKeyByValue(TranslateTable, fileName);
      if (localeKey) {
        Locales[localeKey] = files(key).default;
      }
    }
  });
}

/**
 * @functin 异步加载自定义的 i18n 模版
 * @param {string} lang - 将要更换的语言
 * @return {string} lang - 返回将要更改的语言名后才能
 */

loadAtdLocales();
